#include <bits/types/sigset_t.h>
#include <csignal>
#include <cstddef>
#include <functional>
#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <vector>
using namespace std;
// ***********************************************
void PrintPending(sigset_t &pending) {
    printf("我是一个进程%d, pending: ", getpid());
    for(int i = 31; i >= 1; i--) {
        if(sigismember(&pending, i)) // 这里是未决
        {
            cout << "1";
        }else {
            cout << "0";
        }
    }
    cout << endl;
}
void handler(int sig) {
    cout << "*******************" << endl;
    cout << "递达了" << sig << "信号" << endl;
    sigset_t pending;
    int m = sigpending(&pending);
    PrintPending(pending);
    cout << "*******************" << endl;
}
int main() {
    signal(SIGINT, handler);
    // 屏蔽2号信号
    sigset_t block, oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);

    sigaddset(&block, SIGINT); // 对二号信号进行屏蔽
    for(int i = 1; i < 32; i++) {
        sigaddset(&block, i);
    }
    int n = sigprocmask(SIG_SETMASK, &block, &oblock);
    (void)n;
    // 获取结果
    int cnt = 0;
    while (1) {
        sigset_t pending;
        int m = sigpending(&pending);
        (void)m;
        PrintPending(pending);
        if(cnt == 10) {
            cout << "解除二号的屏蔽了" << endl;
            sigprocmask(SIG_SETMASK, &oblock, nullptr);
        }
        sleep(1);
        cnt++;
    }
    return 0;
}
// ***********************************************
// void handlersig(int sig) {
//     cout << "hello sig: " << sig << endl;
//     signal(sig, SIG_DFL); // 恢复到原来
//     cout << "我已经恢复到了原来的状态了" << endl;
// } 
// int main() {
//     signal(2, handlersig);
//     // signal(2, SIG_IGN);
//     while(1) {
//         sleep(1);
//         cout << getpid() << endl;
//         cout << "." << endl;
//     }
//     return 0;
// }
// ***********************************************
// void handlersig(int sig) {
//     cout << "收到了一个信号：" << sig << endl;
//     exit(1);
// }
// ***********************************************
// 完成一下任务（1秒钟）
// void Sched() {
//     cout << "我是进程调度" << endl;
// }
// void MemManger() {
//     cout << "我是周期性的内存管理，正在检查有没有内存问题" << endl;
// }
// void Fflush() {
//     cout << "我是刷新程序，我在定期刷新内存数据到磁盘。" << endl;
// }
// using func_t = function<void()>;
// vector<func_t> funcs;
// int timestamp = 0;
// void handlersig(int sig) {
//     timestamp++; 
//     cout << "*****************************" << endl;
//     for(auto f : funcs) {
//         f();
//     }
//     cout << "*****************************" << endl;
//     int n = alarm(1);
// }
// // ***********************************************
// int main() {
//     funcs.push_back(Sched);
//     funcs.push_back(MemManger);
//     funcs.push_back(Fflush);
//     signal(SIGALRM, handlersig);
//     alarm(1);
//     while (1) {
//         // cout << "pid: " << getpid() << endl;
//         // sleep(1);
//         pause(); // 进程挂起
//     }
//     return 0;
// }


// ***********************************************
// int count = 0;
// int main() {
//     for(int i = 1; i < 32; i++) {
//         signal(i, handlersig);
//     }
//     alarm(1);
//     while(true) {
//         cout << "count: " << count++ << endl; // 这里1秒钟打印了33037，原因是这里IO的本质就是./xxx->云服务器->网络->我们看见
//     }
//     return 0;
// }


// ***********************************************
// int main() {
//     for(int i = 1; i < 32; i++) {
//         signal(i, handlersig);
//     }
//     // for(int i = 1; i < 32; i++) {
//     //     sleep(1);
//     //     if(i == 9 || i == 19) {
//     //         continue;
//     //     }
//     //     raise(i);
//     // }
//     int cnt = 0;
//     while(true) {
//         cout << "hello world, " << cnt++ << ", mypid: " << getpid() << endl;
//         sleep(1);
//         // int a = 10;
//         // a /= 0;
//         // int *p = nullptr;
//         // *p = 100;
//     }
//     return 0;
// }